Conversation
🎨 Storybook: ✅ Built — View Storybook |
🎭 Playwright: ✅ 555 passed, 0 failed · 2 flaky📊 Browser Reports
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughRefactors AppBuilder inputs/outputs to a DraggableList/IoItem/PropertiesAccordionItem structure, adds Enter App Mode wiring and app-mode awareness in sidebars and menu, centralizes media previews into MediaOutputPreview, introduces useStablePrimeVueSplitterSizer with tests for persistent Splitter widths, and several UI/utility tweaks. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Splitter as Splitter (PrimeVue)
participant LinearView as LinearView (Vue)
participant Sizer as useStablePrimeVueSplitterSizer (Composable)
participant Storage as localStorage
participant DOM as PanelElements
User->>Splitter: drag resize handle
Splitter->>LinearView: emit resizeend(event)
LinearView->>Sizer: onResizeEnd(event)
Sizer->>DOM: read panels' offsetWidth
Sizer->>Storage: persist widths via useStorage keys
rect rgba(100, 150, 200, 0.5)
Note over LinearView,Sizer: On watchSources change (immediate apply)
LinearView->>Sizer: watch triggers applyStoredWidths()
Sizer->>Storage: read stored widths
Sizer->>DOM: set flex-basis and fix flexGrow/flexShrink
end
DOM->>User: panels rendered with persisted widths
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
📦 Bundle: 4.53 MB gzip 🔴 +221 BDetailsSummary
Category Glance App Entry Points — 28.9 kB (baseline 28.9 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 938 kB (baseline 935 kB) • 🔴 +3.03 kBGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 72.4 kB (baseline 72.4 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 9 added / 9 removed Panels & Settings — 436 kB (baseline 436 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 10 added / 10 removed User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 5 added / 5 removed Editors & Dialogs — 76.6 kB (baseline 76.6 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 2 added / 2 removed UI Components — 50.8 kB (baseline 50.8 kB) • ⚪ 0 BReusable component library chunks
Status: 5 added / 5 removed Data & Services — 2.75 MB (baseline 2.75 MB) • 🔴 +93 BStores, services, APIs, and repositories
Status: 14 added / 14 removed Utilities & Hooks — 57.3 kB (baseline 57.3 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 13 added / 13 removed Vendor & Third-Party — 8.88 MB (baseline 8.88 MB) • ⚪ 0 BExternal libraries and shared vendor chunks
Other — 7.93 MB (baseline 7.93 MB) • 🔴 +133 BBundles that do not match a named category
Status: 56 added / 56 removed |
🔧 Auto-fixes AppliedThis PR has been automatically updated to fix linting and formatting issues.
Changes made:
|
fix: remove file extension from workflows tree
- extract media output preview - use in arrange + preview components - center text on arrange step
- refactor builder menu to use standard button - remove template duplication by extracting menu object
91bbb11 to
7714efa
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/locales/en/main.json (1)
3037-3037: Use i18n plural forms fordownloadAllcount text.This key is count-driven; using plural syntax avoids grammar drift if UI conditions change.
♻️ Proposed update
- "downloadAll": "Download {count} assets from this run", + "downloadAll": "Download {count} assets from this run | Download {count} asset from this run | Download {count} assets from this run",As per coding guidelines: "Use
vue-i18nfor ALL user-facing strings ... use the plurals system instead of hardcoding pluralization."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/locales/en/main.json` at line 3037, The "downloadAll" key currently hardcodes a singular/plural string; replace it with a vue-i18n pluralized message so the text varies by count (use vue-i18n plural syntax with {count} interpolation) under the same key "downloadAll" in main.json, and ensure callers pass the count (e.g., $t('main.downloadAll', count: n) or equivalent) so the i18n system selects the correct plural form.src/components/builder/AppBuilder.vue (2)
312-321: Same duplication pattern for outputs section.Similar to the inputs section, the
#emptyslot (lines 312-317) and the subsequent div (lines 318-321) both displaypromptAddOutputs. Consider consolidating if both are not required.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/builder/AppBuilder.vue` around lines 312 - 321, The outputs area duplicates the prompt by rendering the same text in the template slot "#empty" and again immediately after; remove the redundant element so the prompt is rendered only once. Locate the template with "#empty" (the slot rendering v-text="t('linearMode.builder.promptAddOutputs')") in AppBuilder.vue and either keep the slot and delete the subsequent div, or keep the div and remove the "#empty" slot, ensuring only one instance of t('linearMode.builder.promptAddOutputs') remains.
259-268: Duplicate content in empty and default slots.The
#emptyslot (lines 259-264) and the subsequent div (lines 265-268) both render the samepromptAddInputstext. If the#emptyslot is meant for when the accordion is disabled/collapsed and the default slot for when expanded, showing identical content in both cases appears redundant.Verify whether both are needed or if the default slot content (lines 265-268) should be removed.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/builder/AppBuilder.vue` around lines 259 - 268, The template duplicates the same prompt in the accordion empty slot and immediately after it; remove the redundant default div so the prompt is only rendered via the <template `#empty`> slot (or conversely remove the <template `#empty`> and keep the standalone div) to avoid duplicate UI text — locate the duplicate rendering in AppBuilder.vue (the <template `#empty`> block and the following div that both use t('linearMode.builder.promptAddInputs')) and delete the unneeded one.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue`:
- Around line 24-54: The template lacks a final v-else fallback for unrecognized
media types so getMediaType(output) may render nothing; add a v-else branch
after the Preview3d block that renders a visible unsupported-content placeholder
(e.g., a small message/card indicating "Unsupported media type" or a generic
PreviewFallback) using attrs.class and output.url/metadata as context, and also
emit or log a warning (console.warn or a logger) including getMediaType(output)
and output.id to aid debugging; update the template around
ImagePreview/VideoPreview/Preview3d and ensure the fallback appears when
getMediaType returns unexpected values.
---
Nitpick comments:
In `@src/components/builder/AppBuilder.vue`:
- Around line 312-321: The outputs area duplicates the prompt by rendering the
same text in the template slot "#empty" and again immediately after; remove the
redundant element so the prompt is rendered only once. Locate the template with
"#empty" (the slot rendering v-text="t('linearMode.builder.promptAddOutputs')")
in AppBuilder.vue and either keep the slot and delete the subsequent div, or
keep the div and remove the "#empty" slot, ensuring only one instance of
t('linearMode.builder.promptAddOutputs') remains.
- Around line 259-268: The template duplicates the same prompt in the accordion
empty slot and immediately after it; remove the redundant default div so the
prompt is only rendered via the <template `#empty`> slot (or conversely remove the
<template `#empty`> and keep the standalone div) to avoid duplicate UI text —
locate the duplicate rendering in AppBuilder.vue (the <template `#empty`> block
and the following div that both use t('linearMode.builder.promptAddInputs')) and
delete the unneeded one.
In `@src/locales/en/main.json`:
- Line 3037: The "downloadAll" key currently hardcodes a singular/plural string;
replace it with a vue-i18n pluralized message so the text varies by count (use
vue-i18n plural syntax with {count} interpolation) under the same key
"downloadAll" in main.json, and ensure callers pass the count (e.g.,
$t('main.downloadAll', count: n) or equivalent) so the i18n system selects the
correct plural form.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 1ce04483-8010-4896-bc07-57ca3f9c10b1
📒 Files selected for processing (14)
src/components/builder/AppBuilder.vuesrc/components/builder/BuilderMenu.vuesrc/components/rightSidePanel/errors/MissingNodeCard.vuesrc/components/sidebar/tabs/AppsSidebarTab.vuesrc/components/sidebar/tabs/BaseWorkflowsSidebarTab.vuesrc/composables/useStablePrimeVueSplitterSizer.test.tssrc/composables/useStablePrimeVueSplitterSizer.tssrc/locales/en/main.jsonsrc/renderer/extensions/linearMode/ImagePreview.vuesrc/renderer/extensions/linearMode/LinearArrange.vuesrc/renderer/extensions/linearMode/LinearPreview.vuesrc/renderer/extensions/linearMode/MediaOutputPreview.vuesrc/scripts/ui/draggableList.tssrc/views/LinearView.vue
There was a problem hiding this comment.
Actionable comments posted: 3
♻️ Duplicate comments (1)
src/renderer/extensions/linearMode/MediaOutputPreview.vue (1)
24-54:⚠️ Potential issue | 🟡 MinorAdd a fallback branch for unsupported media types.
If
getMediaType(output)returns an unexpected value, this component currently renders nothing.💡 Proposed fallback branch
<Preview3d v-else-if="getMediaType(output) === '3d'" :class="attrs.class as string" :model-url="output.url" /> + <div + v-else + :class=" + cn( + 'flex items-center justify-center text-muted-foreground', + attrs.class as string + ) + " + > + {{ $t('linearMode.unsupportedMediaType') }} + </div> </template>As per coding guidelines, "Use
vue-i18nfor ALL user-facing strings, configured insrc/locales/en/main.json."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue` around lines 24 - 54, The component renders nothing for unknown media types; add a final v-else fallback block in MediaOutputPreview that displays a user-facing message (e.g., a centered div or paragraph) when getMediaType(output) returns an unexpected value, using this.$t('media.unsupported') (vue-i18n) instead of hard-coded text; also add the corresponding key "media.unsupported" with the English message to src/locales/en/main.json so translations are available.
🧹 Nitpick comments (2)
src/composables/useStablePrimeVueSplitterSizer.test.ts (1)
8-14: Current mock does not fully emulateuseStoragekey-based persistence, but tests as written do not require it.The mock ignores the
keyparameter and returns a freshref(defaultValue)on each call, losing the real behavior where same-key calls read previously stored values. However, because no test instantiates the composable twice with the same storage key, this gap doesn't affect behavioral coverage here. Tests verify capture, apply, multi-panel independence, and null-ref handling within single composable instances—all working correctly with the current mock.If persistence across re-instantiation becomes a behavioral requirement to test, follow the project pattern of using
vi.hoisted()for per-test mock state isolation (seen throughoutsrc/composables/*.test.ts), rather than introducing a global mutable store.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/composables/useStablePrimeVueSplitterSizer.test.ts` around lines 8 - 14, The current vi.mock for useStorage ignores the key and returns a fresh ref, so if you need same-key persistence across composable re-instantiation update the mock to maintain a per-test key->ref map: hoist a mutable store with vi.hoisted(), implement the mocked useStorage(key, defaultValue) to return the existing ref for that key or create and store ref(defaultValue) if missing, and ensure tests reset isolation by keeping the hoisted store per-test; reference the mocked function name useStorage, the existing vi.mock call, and vi.hoisted for where to implement the per-test state.src/renderer/extensions/linearMode/MediaOutputPreview.vue (1)
10-12: Wrap async 3D preview rendering in aSuspenseboundary.
Preview3dis async-loaded, but there is no explicit loading/error fallback in this branch. Please render it with<Suspense>for deterministic UX during load.As per coding guidelines, "Use Suspense for async components."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue` around lines 10 - 12, The async component Preview3d (created via defineAsyncComponent) must be rendered inside a Vue <Suspense> boundary to provide deterministic loading/error UX; update the MediaOutputPreview component to wrap the <Preview3d ... /> usage with <Suspense> and add a fallback (e.g., a loading placeholder) in the fallback slot and an error/fallback branch for failures so the UI shows a stable loader while the async chunk loads and surfaces an error state if it fails.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/components/builder/AppBuilder.vue`:
- Around line 318-321: Remove the duplicated guidance div that's duplicating the
`#empty` template: delete the <div class="w-full p-4 pt-2 text-muted-foreground"
v-text="t('linearMode.builder.promptAddOutputs')"/> so the guidance is only
rendered by the existing `#empty` template; confirm no other duplicated
v-text("t('linearMode.builder.promptAddOutputs')") instances remain in
AppBuilder.vue.
- Around line 265-268: The div rendering the prompt via v-text
("t('linearMode.builder.promptAddInputs')") is duplicated outside the `#empty`
slot and causes the guidance to always display; remove that external div so the
prompt only appears via the PropertiesAccordionItem empty slot when there are no
inputs (refer to the PropertiesAccordionItem usage and the DraggableList/default
slot in AppBuilder.vue), leaving the `#empty` template as the sole source of the
empty-state message.
In `@src/renderer/extensions/linearMode/LinearPreview.vue`:
- Around line 110-115: In LinearPreview.vue, remove the redundant aria-label
attribute from the visible-text interrupt Button (the element rendering {{
t('linearMode.cancelThisRun') }}) so screen readers don't get duplicate labels;
locate the Button that calls commandStore.execute('Comfy.Interrupt') and delete
the :aria-label="t('linearMode.cancelThisRun')" attribute, leaving the click
handler and visible text intact.
---
Duplicate comments:
In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue`:
- Around line 24-54: The component renders nothing for unknown media types; add
a final v-else fallback block in MediaOutputPreview that displays a user-facing
message (e.g., a centered div or paragraph) when getMediaType(output) returns an
unexpected value, using this.$t('media.unsupported') (vue-i18n) instead of
hard-coded text; also add the corresponding key "media.unsupported" with the
English message to src/locales/en/main.json so translations are available.
---
Nitpick comments:
In `@src/composables/useStablePrimeVueSplitterSizer.test.ts`:
- Around line 8-14: The current vi.mock for useStorage ignores the key and
returns a fresh ref, so if you need same-key persistence across composable
re-instantiation update the mock to maintain a per-test key->ref map: hoist a
mutable store with vi.hoisted(), implement the mocked useStorage(key,
defaultValue) to return the existing ref for that key or create and store
ref(defaultValue) if missing, and ensure tests reset isolation by keeping the
hoisted store per-test; reference the mocked function name useStorage, the
existing vi.mock call, and vi.hoisted for where to implement the per-test state.
In `@src/renderer/extensions/linearMode/MediaOutputPreview.vue`:
- Around line 10-12: The async component Preview3d (created via
defineAsyncComponent) must be rendered inside a Vue <Suspense> boundary to
provide deterministic loading/error UX; update the MediaOutputPreview component
to wrap the <Preview3d ... /> usage with <Suspense> and add a fallback (e.g., a
loading placeholder) in the fallback slot and an error/fallback branch for
failures so the UI shows a stable loader while the async chunk loads and
surfaces an error state if it fails.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 52e02faa-e9e3-405c-8afe-131d0b4782c7
📒 Files selected for processing (13)
src/components/builder/AppBuilder.vuesrc/components/builder/BuilderMenu.vuesrc/components/sidebar/tabs/AppsSidebarTab.vuesrc/components/sidebar/tabs/BaseWorkflowsSidebarTab.vuesrc/composables/useStablePrimeVueSplitterSizer.test.tssrc/composables/useStablePrimeVueSplitterSizer.tssrc/locales/en/main.jsonsrc/renderer/extensions/linearMode/ImagePreview.vuesrc/renderer/extensions/linearMode/LinearArrange.vuesrc/renderer/extensions/linearMode/LinearPreview.vuesrc/renderer/extensions/linearMode/MediaOutputPreview.vuesrc/scripts/ui/draggableList.tssrc/views/LinearView.vue
🚧 Files skipped from review as they are similar to previous changes (4)
- src/renderer/extensions/linearMode/ImagePreview.vue
- src/views/LinearView.vue
- src/locales/en/main.json
- src/scripts/ui/draggableList.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/renderer/extensions/linearMode/LinearPreview.vue`:
- Around line 71-75: The rerun function is calling the runButtonClick prop
without awaiting it, which swallows errors and breaks sequencing; update the
prop definition for runButtonClick (the prop used in LinearPreview.vue) to
accept an async function/Promise-returning signature and change the rerun
function to await runButtonClick(e) after await loadWorkflow(selectedItem.value)
so the async callback's errors propagate and execution order is preserved;
ensure any callers (e.g., LinearControls.vue) still pass an async function that
returns a Promise.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: fc58f90f-b3a5-4eaf-99b2-52b4cb353f38
📒 Files selected for processing (1)
src/renderer/extensions/linearMode/LinearPreview.vue
AustinMroz
left a comment
There was a problem hiding this comment.
Splitter changes are spooky, but work well from my testing.
Didn't know that reka-UI was adding pixel sizes. That's super exciting.
When I last attempted a migration, there was some bugginess where "setting a size well bellow the minimum content size for an area (as we did with 1-98-1) would require a panel be dragged the distance of this discrepency before resizing would visually occur."
Since pixel sizes would solve this, we may be able to migrate in the future.
| <ZoomPane | ||
| v-if="!mobile" | ||
| v-slot="slotProps" | ||
| :class="cn('flex-1 w-full', attrs.class as string)" |
There was a problem hiding this comment.
You can use $attrs instead of the importing useAttrs
| :class="cn('flex-1 w-full', attrs.class as string)" | |
| :class="cn('flex-1 w-full', $attrs.class as string)" |
As a whole, I'm confused for why the attrs changes are needed in the first place. Both from my understanding of vue, and quick testing, the padding changes in LinearArrange will still correctly propagate downwards.
⚡ Performance Report
Raw data{
"timestamp": "2026-03-06T20:00:36.376Z",
"gitSha": "72d97c5a2ab0cd09a3dbcf038d88c61fd49b9a0a",
"branch": "pysssss/app-mode-fixes",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2009.4359999999938,
"styleRecalcs": 120,
"styleRecalcDurationMs": 21.802,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 417.83000000000004,
"heapDeltaBytes": -1625788
},
{
"name": "canvas-idle",
"durationMs": 2035.6740000000002,
"styleRecalcs": 124,
"styleRecalcDurationMs": 24.485999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 419.47299999999996,
"heapDeltaBytes": -2342768
},
{
"name": "canvas-idle",
"durationMs": 2021.2340000000495,
"styleRecalcs": 123,
"styleRecalcDurationMs": 24.141999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 425.691,
"heapDeltaBytes": -3034720
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2094.332999999978,
"styleRecalcs": 189,
"styleRecalcDurationMs": 64.98799999999999,
"layouts": 13,
"layoutDurationMs": 3.772,
"taskDurationMs": 1143.1979999999999,
"heapDeltaBytes": -2220488
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1857.5810000000104,
"styleRecalcs": 170,
"styleRecalcDurationMs": 52.53000000000001,
"layouts": 12,
"layoutDurationMs": 3.248999999999999,
"taskDurationMs": 841.496,
"heapDeltaBytes": -1864588
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2029.471000000001,
"styleRecalcs": 181,
"styleRecalcDurationMs": 55.779,
"layouts": 12,
"layoutDurationMs": 3.372,
"taskDurationMs": 1033.281,
"heapDeltaBytes": -3291384
},
{
"name": "dom-widget-clipping",
"durationMs": 579.44999999998,
"styleRecalcs": 42,
"styleRecalcDurationMs": 14.285999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 360.546,
"heapDeltaBytes": 6695520
},
{
"name": "dom-widget-clipping",
"durationMs": 570.2409999999816,
"styleRecalcs": 42,
"styleRecalcDurationMs": 13.835999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 351.976,
"heapDeltaBytes": 6472372
},
{
"name": "dom-widget-clipping",
"durationMs": 565.1230000000282,
"styleRecalcs": 42,
"styleRecalcDurationMs": 12.93,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 351.28999999999996,
"heapDeltaBytes": 6494656
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 595.4700000000059,
"styleRecalcs": 74,
"styleRecalcDurationMs": 16.288,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 419.77400000000006,
"heapDeltaBytes": -9909288
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 609.8120000000335,
"styleRecalcs": 74,
"styleRecalcDurationMs": 17.267999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 429.32000000000005,
"heapDeltaBytes": 15880364
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 607.9960000000142,
"styleRecalcs": 74,
"styleRecalcDurationMs": 15.995000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 415.643,
"heapDeltaBytes": -8614496
},
{
"name": "subgraph-idle",
"durationMs": 1994.9880000000064,
"styleRecalcs": 120,
"styleRecalcDurationMs": 23.915999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 421.11699999999996,
"heapDeltaBytes": -1762552
},
{
"name": "subgraph-idle",
"durationMs": 2006.1220000000048,
"styleRecalcs": 121,
"styleRecalcDurationMs": 22.447000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 406.615,
"heapDeltaBytes": -1802200
},
{
"name": "subgraph-idle",
"durationMs": 1999.6909999999843,
"styleRecalcs": 121,
"styleRecalcDurationMs": 20.682,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 381.26900000000006,
"heapDeltaBytes": -3288664
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1698.0580000000032,
"styleRecalcs": 155,
"styleRecalcDurationMs": 50.17699999999999,
"layouts": 16,
"layoutDurationMs": 4.6610000000000005,
"taskDurationMs": 757.217,
"heapDeltaBytes": -5441132
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 2026.3429999999971,
"styleRecalcs": 176,
"styleRecalcDurationMs": 61.189,
"layouts": 17,
"layoutDurationMs": 4.687,
"taskDurationMs": 1012.9619999999999,
"heapDeltaBytes": -2632788
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1704.4250000000147,
"styleRecalcs": 157,
"styleRecalcDurationMs": 50.257000000000005,
"layouts": 17,
"layoutDurationMs": 4.397999999999999,
"taskDurationMs": 730.174,
"heapDeltaBytes": -4827156
}
]
} |
|
@coderabbitai add a new issue to look at upgrading reka-ui and replacing PrimeVue splitters so we can use pixel sizing https://reka-ui.com/docs/components/splitter#pixel-sizing |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chainLet me check the current reka-ui version before creating the issue. 🏁 Script executed: Length of output: 26 🏁 Script executed: Length of output: 27 🏁 Script executed: Length of output: 459 🏁 Script executed: Length of output: 241 🏁 Script executed: Length of output: 57
It covers:
🧠 Learnings used |
Summary
Various fixes from app mode QA
Changes
What:
fix: prevent inserting nodes from workflow/apps sidebar tabs
fix: hide json extension in workflow tab
fix: hide apps nav button in apps tab when already in apps mode
fix: center text on arrange page
fix: prevent IoItems from "jumping" due to stale transform after drag and drop op
fix: refactor side panels and add custom stable pixel based sizing
fix: make outputs/inputs lists in app builder scrollable
fix: fix rerun not working correctly
feat: add text to interrupt button
feat: add enter app mode button to builder toolbar
feat: add tooltip to download button on linear view
feat: show last output of workflow in arrange tab if available
feat: show download count in download all button, hide if only 1 asset to download
Review Focus
Screenshots (if applicable)
┆Issue is synchronized with this Notion page by Unito